/*
* Copyright 2011 NTT Software Corporation.
* All Rights Reserved.
*/
package jp.co.ntts.vhut.task;
import static jp.co.ntts.vhut.entity.Names.application;
import static jp.co.ntts.vhut.entity.Names.applicationInstance;
import static jp.co.ntts.vhut.entity.Names.releasedApplication;
import java.sql.Timestamp;
import java.util.List;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import javax.transaction.HeuristicMixedException;
import javax.transaction.HeuristicRollbackException;
import javax.transaction.NotSupportedException;
import javax.transaction.RollbackException;
import javax.transaction.SystemException;
import javax.transaction.UserTransaction;
import jp.co.ntts.vhut.config.ServiceConfig;
import jp.co.ntts.vhut.entity.Application;
import jp.co.ntts.vhut.entity.ApplicationInstance;
import jp.co.ntts.vhut.entity.ApplicationInstanceStatus;
import jp.co.ntts.vhut.entity.ApplicationInstanceVm;
import jp.co.ntts.vhut.entity.ApplicationStatus;
import jp.co.ntts.vhut.entity.ApplicationVm;
import jp.co.ntts.vhut.entity.Command;
import jp.co.ntts.vhut.entity.ReleasedApplication;
import jp.co.ntts.vhut.entity.ReleasedApplicationStatus;
import jp.co.ntts.vhut.entity.ReleasedApplicationTemplate;
import jp.co.ntts.vhut.factory.CloudLogicFactory;
import jp.co.ntts.vhut.logic.ICloudServiceLogic;
import jp.co.ntts.vhut.util.TimestampUtil;
import jp.co.ntts.vhut.util.VhutLogger;
import org.seasar.chronos.core.TaskTrigger;
import org.seasar.chronos.core.annotation.task.Task;
import org.seasar.chronos.core.annotation.task.method.NextTask;
import org.seasar.config.core.container.ConfigContainer;
import org.seasar.extension.jdbc.JdbcManager;
import org.seasar.extension.jdbc.where.SimpleWhere;
import org.seasar.framework.container.SingletonS2Container;
import org.seasar.framework.container.annotation.tiger.InitMethod;
/**
* <p>サービス関連の状態管理を行うタスク.
* <br>
* <p>短い間隔で呼び出され以下の処理を実行する。
* <ul>
* <li>Applicationの状態を確認して状態遷移させる。
* <li>ApplicationInstanceの状態を確認して状態遷移させる。
* <li>ReleasedApplicationの状態を確認して状態遷移させる。
* </ul>
*/
@Task
public class ServiceCheckTask {
/**
* ロガー.
*/
private static VhutLogger logger = VhutLogger.getLogger(ServiceCheckTask.class);
/**
* デフォルトトリガー.
*/
// private static final TaskTrigger DEFAULT_TRIGGER = new CCronTrigger("*/10 * * * * ?");
/**
* サービスの設定.
*/
public ServiceConfig serviceConfig;
/**
* JDBCアクセス手段.
*/
public JdbcManager jdbcManager;
/**
* クラウドロジックの作成クラス.
*/
public CloudLogicFactory cloudLogicFactory;
/**
* 現在時刻(検索用).
*/
public Timestamp currentTime;
/**
* トランザクションを手動制御
*/
public UserTransaction userTransaction;
/**
* トランザクションIDタスクの識別子.
*/
private String transactionId;
/**
* 各処理で発生した例外.
*/
private Exception exception;
@InitMethod
public void init() {
ConfigContainer configContainer = SingletonS2Container.getComponent(ConfigContainer.class);
configContainer.loadToBeans();
}
// /**
// * 初期化処理.
// */
// public void initialize() {
// logger.debug("DSVCT0011");
// }
/**
* このタスクを呼び出すトリガを取得する.
* Schedulerから呼び出されます。
* @return 設定ファイルで定義したトリガー
*/
public TaskTrigger getTrigger() {
return serviceConfig.getServiceCheckTaskTrigger();
}
/**
* 開始処理.
*/
@NextTask("checkCreatingApplication")
public void start() {
transactionId = VhutLogger.createTransactionId();
currentTime = TimestampUtil.getCurrentTimestamp();
logger.start(transactionId, "ISVCT0011", new Object[]{});
}
/**
* Applicationの状態遷移(CREATING->DEACTIVE)を行います.
* <p>
* 対象:Application<br>
* 状態遷移:CREATING->DEACTIVE
* <p>
* 条件:関連コマンドがすべて終了
* @throws SystemException
* @throws IllegalStateException
* @throws NotSupportedException
* @throws RollbackException
* @throws HeuristicRollbackException
* @throws HeuristicMixedException
* @throws SecurityException
*/
@NextTask("checkUpdatingApplication")
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
public void doCheckCreatingApplication() throws IllegalStateException, SystemException, NotSupportedException, SecurityException, HeuristicMixedException, HeuristicRollbackException, RollbackException {
List<Application> apps = jdbcManager.from(Application.class)
.leftOuterJoin(application().applicationVmList())
.where(new SimpleWhere().eq(application().status(), ApplicationStatus.CREATING))
.getResultList();
for (Application app : apps) {
userTransaction.begin();
try {
boolean isDone = true;
for (ApplicationVm avm : app.applicationVmList) {
ICloudServiceLogic csl = cloudLogicFactory.newCloudServiceLogic(avm.cloudId);
List<Command> cmds = csl.getCommandListByVmId(avm.vmId);
if (cmds != null) {
if (cmds.size() > 0) {
isDone = false;
break;
}
}
}
if (isDone) {
app.status = ApplicationStatus.DEACTIVE;
jdbcManager.update(app)
.includes(application().status())
.execute();
}
} catch (Exception e) {
logger.log("ESVCT5011", new Object[]{ app.id }, e);
userTransaction.rollback();
continue;
}
userTransaction.commit();
}
}
/**
* Applicationの状態遷移(UPDATING->DEACTIVE)を行います.
* <p>
* 対象:Application<br>
* 状態遷移:UPDATING->DEACTIVE
* <p>
* 条件:関連コマンドがすべて終了
* @throws SystemException
* @throws NotSupportedException
* @throws RollbackException
* @throws HeuristicRollbackException
* @throws HeuristicMixedException
* @throws SecurityException
* @throws IllegalStateException
*/
@NextTask("checkReleasingApplication")
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
public void doCheckUpdatingApplication() throws NotSupportedException, SystemException, IllegalStateException, SecurityException, HeuristicMixedException, HeuristicRollbackException, RollbackException {
List<Application> apps = jdbcManager.from(Application.class)
.leftOuterJoin(application().applicationVmList())
.where(new SimpleWhere().eq(application().status(), ApplicationStatus.UPDATING))
.getResultList();
for (Application app : apps) {
userTransaction.begin();
try {
boolean isDone = true;
for (ApplicationVm avm : app.applicationVmList) {
ICloudServiceLogic csl = cloudLogicFactory.newCloudServiceLogic(avm.cloudId);
List<Command> cmds = csl.getCommandListByVmId(avm.vmId);
if (cmds != null) {
if (cmds.size() > 0) {
isDone = false;
break;
}
}
}
if (isDone) {
app.status = ApplicationStatus.DEACTIVE;
jdbcManager.update(app)
.includes(application().status())
.execute();
}
} catch (Exception e) {
logger.log("ESVCT5012", new Object[]{ app.id }, e);
userTransaction.rollback();
continue;
}
userTransaction.commit();
}
}
/**
* Applicationの状態遷移(RELEASING->DEACTIVE)を行います.
* <p>
* 対象:Application<br>
* 状態遷移:RELEASING->DEACTIVE
* <p>
* 条件:関連コマンドがすべて終了
* @throws SystemException
* @throws NotSupportedException
* @throws RollbackException
* @throws HeuristicRollbackException
* @throws HeuristicMixedException
* @throws SecurityException
* @throws IllegalStateException
*/
@NextTask("checkDeletingApplication")
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
public void doCheckReleasingApplication() throws NotSupportedException, SystemException, IllegalStateException, SecurityException, HeuristicMixedException, HeuristicRollbackException, RollbackException {
List<Application> apps = jdbcManager.from(Application.class)
.leftOuterJoin(application().applicationVmList())
.where(new SimpleWhere().eq(application().status(), ApplicationStatus.RELEASING))
.getResultList();
for (Application app : apps) {
userTransaction.begin();
try {
boolean isDone = true;
for (ApplicationVm avm : app.applicationVmList) {
ICloudServiceLogic csl = cloudLogicFactory.newCloudServiceLogic(avm.cloudId);
List<Command> cmds = csl.getCommandListByVmId(avm.vmId);
if (cmds != null) {
if (cmds.size() > 0) {
isDone = false;
break;
}
}
}
if (isDone) {
app.status = ApplicationStatus.DEACTIVE;
jdbcManager.update(app)
.includes(application().status())
.execute();
}
} catch (Exception e) {
logger.log("ESVCT5013", new Object[]{ app.id }, e);
userTransaction.rollback();
continue;
}
userTransaction.commit();
}
}
/**
* Applicationの状態遷移(DELETING->DELETED)を行います.
* <p>
* 対象:Application<br>
* 状態遷移:DELETING->DELETED
* <p>
* 条件:関連コマンドがすべて終了
* @throws SystemException
* @throws NotSupportedException
* @throws RollbackException
* @throws HeuristicRollbackException
* @throws HeuristicMixedException
* @throws SecurityException
* @throws IllegalStateException
*/
@NextTask("checkCreatingReleasedApplication")
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
public void doCheckDeletingApplication() throws NotSupportedException, SystemException, IllegalStateException, SecurityException, HeuristicMixedException, HeuristicRollbackException, RollbackException {
List<Application> apps = jdbcManager.from(Application.class)
.leftOuterJoin(application().applicationVmList())
.where(new SimpleWhere().eq(application().status(), ApplicationStatus.DELETING))
.getResultList();
for (Application app : apps) {
userTransaction.begin();
try {
boolean isDone = true;
for (ApplicationVm avm : app.applicationVmList) {
ICloudServiceLogic csl = cloudLogicFactory.newCloudServiceLogic(avm.cloudId);
List<Command> cmds = csl.getCommandListByVmId(avm.vmId);
if (cmds != null) {
if (cmds.size() > 0) {
isDone = false;
break;
}
}
}
if (isDone) {
app.status = ApplicationStatus.DELETED;
jdbcManager.update(app)
.includes(application().status())
.execute();
}
} catch (Exception e) {
logger.log("ESVCT5014", new Object[]{ app.id }, e);
userTransaction.rollback();
continue;
}
userTransaction.commit();
}
}
/**
* ReleasedApplicationの状態遷移(CREATING->READY)を行います.
* <p>
* 対象:ReleasedApplication<br>
* 状態遷移:CREATING->READY
* <p>
* 条件:関連コマンドがすべて終了
* @throws SystemException
* @throws NotSupportedException
* @throws RollbackException
* @throws HeuristicRollbackException
* @throws HeuristicMixedException
* @throws SecurityException
* @throws IllegalStateException
*/
@NextTask("checkDeletingReleasedApplication")
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
public void doCheckCreatingReleasedApplication() throws NotSupportedException, SystemException, IllegalStateException, SecurityException, HeuristicMixedException, HeuristicRollbackException, RollbackException {
List<ReleasedApplication> rapps = jdbcManager.from(ReleasedApplication.class)
.leftOuterJoin(releasedApplication().releasedApplicationTemplateList())
.where(new SimpleWhere().eq(releasedApplication().status(), ReleasedApplicationStatus.CREATING))
.getResultList();
for (ReleasedApplication rapp : rapps) {
userTransaction.begin();
try {
boolean isDone = true;
for (ReleasedApplicationTemplate rat : rapp.releasedApplicationTemplateList) {
ICloudServiceLogic csl = cloudLogicFactory.newCloudServiceLogic(rat.cloudId);
List<Command> cmds = csl.getCommandListByTemplateId(rat.templateId);
if (cmds != null) {
if (cmds.size() > 0) {
isDone = false;
break;
}
}
}
if (isDone) {
rapp.status = ReleasedApplicationStatus.READY;
jdbcManager.update(rapp)
.includes(releasedApplication().status())
.execute();
}
} catch (Exception e) {
logger.log("ESVCT5015", new Object[]{ rapp.id }, e);
userTransaction.rollback();
continue;
}
userTransaction.commit();
}
}
/**
* ReleasedApplicationの状態遷移(DELETING->DELETED)を行います.
* <p>
* 対象:ReleasedApplication<br>
* 状態遷移:DELETING->DELETED
* <p>
* 条件:関連コマンドがすべて終了
* @throws SystemException
* @throws NotSupportedException
* @throws RollbackException
* @throws HeuristicRollbackException
* @throws HeuristicMixedException
* @throws SecurityException
* @throws IllegalStateException
*/
@NextTask("checkCreatingApplicationInstance")
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
public void doCheckDeletingReleasedApplication() throws NotSupportedException, SystemException, IllegalStateException, SecurityException, HeuristicMixedException, HeuristicRollbackException, RollbackException {
List<ReleasedApplication> rapps = jdbcManager.from(ReleasedApplication.class)
.leftOuterJoin(releasedApplication().releasedApplicationTemplateList())
.where(new SimpleWhere().eq(releasedApplication().status(), ReleasedApplicationStatus.DELETING))
.getResultList();
for (ReleasedApplication rapp : rapps) {
userTransaction.begin();
try {
boolean isDone = true;
for (ReleasedApplicationTemplate rat : rapp.releasedApplicationTemplateList) {
ICloudServiceLogic csl = cloudLogicFactory.newCloudServiceLogic(rat.cloudId);
List<Command> cmds = csl.getCommandListByTemplateId(rat.templateId);
if (cmds != null) {
if (cmds.size() > 0) {
isDone = false;
break;
}
}
}
if (isDone) {
rapp.status = ReleasedApplicationStatus.DELETED;
jdbcManager.update(rapp)
.includes(releasedApplication().status())
.execute();
}
} catch (Exception e) {
logger.log("ESVCT5016", new Object[]{ rapp.id }, e);
userTransaction.rollback();
continue;
}
userTransaction.commit();
}
}
/**
* ApplicationInstanceの状態遷移(CREATING->DEACTIVE)を行います.
* <p>
* 対象:ApplicationInstance<br>
* 状態遷移:CREATING->DEACTIVE
* <p>
* 条件:関連コマンドがすべて終了
* @throws SystemException
* @throws IllegalStateException
* @throws NotSupportedException
* @throws RollbackException
* @throws HeuristicRollbackException
* @throws HeuristicMixedException
* @throws SecurityException
*/
@NextTask("checkRebuildingApplicationInstance")
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
public void doCheckCreatingApplicationInstance() throws IllegalStateException, SystemException, NotSupportedException, SecurityException, HeuristicMixedException, HeuristicRollbackException, RollbackException {
List<ApplicationInstance> ais = jdbcManager.from(ApplicationInstance.class)
.leftOuterJoin(applicationInstance().applicationInstanceVmList())
.where(new SimpleWhere().eq(applicationInstance().status(), ApplicationInstanceStatus.CREATING))
.getResultList();
for (ApplicationInstance ai : ais) {
userTransaction.begin();
try {
boolean isDone = true;
for (ApplicationInstanceVm aivm : ai.applicationInstanceVmList) {
ICloudServiceLogic csl = cloudLogicFactory.newCloudServiceLogic(aivm.cloudId);
List<Command> cmds = csl.getCommandListByVmId(aivm.vmId);
if (cmds != null) {
if (cmds.size() > 0) {
isDone = false;
break;
}
}
}
if (isDone) {
ai.status = ApplicationInstanceStatus.DEACTIVE;
jdbcManager.update(ai)
.includes(applicationInstance().status())
.execute();
}
} catch (Exception e) {
logger.log("ESVCT5017", new Object[]{ ai.id }, e);
userTransaction.rollback();
continue;
}
userTransaction.commit();
}
}
/**
* ApplicationInstanceの状態遷移(REBUILDING->DEACTIVE)を行います.
* <p>
* 対象:ApplicationInstance<br>
* 状態遷移:REBUILDING->DEACTIVE
* <p>
* 条件:関連コマンドがすべて終了
* @throws SystemException
* @throws NotSupportedException
* @throws RollbackException
* @throws HeuristicRollbackException
* @throws HeuristicMixedException
* @throws SecurityException
* @throws IllegalStateException
*/
@NextTask("checkDeletingApplicationInstance")
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
public void doCheckRebuildingApplicationInstance() throws NotSupportedException, SystemException, IllegalStateException, SecurityException, HeuristicMixedException, HeuristicRollbackException, RollbackException {
List<ApplicationInstance> ais = jdbcManager.from(ApplicationInstance.class)
.leftOuterJoin(applicationInstance().applicationInstanceVmList())
.where(new SimpleWhere().eq(applicationInstance().status(), ApplicationInstanceStatus.REBUILDING))
.getResultList();
for (ApplicationInstance ai : ais) {
userTransaction.begin();
try {
boolean isDone = true;
for (ApplicationInstanceVm aivm : ai.applicationInstanceVmList) {
ICloudServiceLogic csl = cloudLogicFactory.newCloudServiceLogic(aivm.cloudId);
List<Command> cmds = csl.getCommandListByVmId(aivm.vmId);
if (cmds != null) {
if (cmds.size() > 0) {
isDone = false;
break;
}
}
}
if (isDone) {
ai.status = ApplicationInstanceStatus.DEACTIVE;
jdbcManager.update(ai)
.includes(applicationInstance().status())
.execute();
}
} catch (Exception e) {
logger.log("ESVCT5018", new Object[]{ ai.id }, e);
userTransaction.rollback();
continue;
}
userTransaction.commit();
}
}
/**
* ApplicationInstanceの状態遷移(DELETING->DELETED)を行います.
* <p>
* 対象:ApplicationInstance<br>
* 状態遷移:DELETING->DELETED
* <p>
* 条件:関連コマンドがすべて終了
* @throws SystemException
* @throws NotSupportedException
* @throws RollbackException
* @throws HeuristicRollbackException
* @throws HeuristicMixedException
* @throws SecurityException
* @throws IllegalStateException
*/
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
public void doCheckDeletingApplicationInstance() throws NotSupportedException, SystemException, IllegalStateException, SecurityException, HeuristicMixedException, HeuristicRollbackException, RollbackException {
List<ApplicationInstance> ais = jdbcManager.from(ApplicationInstance.class)
.leftOuterJoin(applicationInstance().applicationInstanceVmList())
.where(new SimpleWhere().eq(applicationInstance().status(), ApplicationInstanceStatus.DELETING))
.getResultList();
for (ApplicationInstance ai : ais) {
userTransaction.begin();
try {
boolean isDone = true;
for (ApplicationInstanceVm aivm : ai.applicationInstanceVmList) {
ICloudServiceLogic csl = cloudLogicFactory.newCloudServiceLogic(aivm.cloudId);
List<Command> cmds = csl.getCommandListByVmId(aivm.vmId);
if (cmds != null) {
if (cmds.size() > 0) {
isDone = false;
break;
}
}
}
if (isDone) {
ai.status = ApplicationInstanceStatus.DELETED;
jdbcManager.update(ai)
.includes(applicationInstance().status())
.execute();
}
} catch (Exception e) {
logger.log("ESVCT5019", new Object[]{ ai.id }, e);
userTransaction.rollback();
continue;
}
userTransaction.commit();
}
}
/**
* すべてのタスクメソッドが終了したら呼ばれます.
*/
public void end() {
if (exception != null) {
logger.end(transactionId, "ESVCT0012", new Object[]{}, exception);
} else {
logger.end(transactionId, "ISVCT0012", new Object[]{});
}
}
/**
* 共通的な例外処理です.
* @param ex 各処理で発生した例外.
*/
public void catchException(Exception ex) {
this.exception = ex;
}
/**
* 処理が中断され、タスクオブジェクトが破棄される直前に実行されます.
*/
public void destroy() {
if (exception != null) {
logger.end(transactionId, "ESVCT0012", new Object[]{}, exception);
} else {
logger.end(transactionId, "ESVCT0012", new Object[]{});
}
}
}
/**
* =====================================================================
*
* Copyright 2011 NTT Sofware Corporation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* =====================================================================
*/